﻿using System;
using System.Collections.Generic;
using System.Windows;

namespace WpfMetro
{
	// From: http://www.wpftutorial.net/MergedDictionaryPerformance.html

	/// <summary>
	/// The shared resource dictionary is a specialized resource dictionary
	/// that loads it content only once. If a second instance with the same source
	/// is created, it only merges the resources from the cache.
	/// </summary>
	public class SharedResourceDictionary : ResourceDictionary
	{
		private static readonly Dictionary<Uri, ResourceDictionary> _sharedDictionaries =
			new Dictionary<Uri, ResourceDictionary>();

		private Uri _sourceUri;

		/// <summary>
		/// Gets or sets the uniform resource identifier (URI) to load resources from.
		/// </summary>
		public new Uri Source
		{
			get { return _sourceUri; }
			set
			{
				_sourceUri = value;

				ResourceDictionary cachedDictionary;
				if (!_sharedDictionaries.TryGetValue(value, out cachedDictionary))
				{
					// If the dictionary is not yet loaded, load it by setting
					// the source of the base class
					base.Source = value;

					// add it to the cache
					_sharedDictionaries.Add(value, this);
				}
				else
				{
					// If the dictionary is already loaded, get it from the cache
					MergedDictionaries.Add(cachedDictionary);
				}
			}
		}
	}
}
